On commence à rentrer dans le domaine complexe d'opengl. Le but de se cours étant écrit de manière à vous faire comprendre les grands principes sans vous gonfler avec des calculs interminables, je vais passer la théorie algebrique pour venir plus rapidement aux thequniques à utiliser.
Je vais quand même vous donner la formule du calcul de trajectoire de la lumière: |
Specular(R/G/B) = AmbienteMatériau(R/G/B) * AmbienteLumière(R/G/B) |
Diffuse(R/G/B) = DiffuseMatériau(R/G/B) * DiffuseLumière(R/G/B) * Sin(alpha) |
et |
l'Ambiante ne varie pas. |
Nous avons vu au chapitre précédent que chaque matière possède trois couleurs. Lorsque l'on active la lumière avec glEnable(GL_LIGHTING); suivi de glEnable(GL_LIGHT0);, et que l'on donne une couleur à la matière, ça nous donne les photos qui sont dans le chapitre "formes avec glut".
Mais d'après ces formules on remarque qu'il manque les trois couleurs de la lumière. Si ça marche quand même c'est grâce à ses couleurs par défault qui sont blanches. On multiplie une couleur avec du blanc et sa nous donne la couleur de départ. Donc en général on ne donne de couleurs qu'aux matières, et on ne s'occupe pas de la lumière.
On active la lumière avec glEnable(GL_LIGHTING); et on crée une lumière avec glEnable(GL_LIGHT0);, si on ne le fait pas, on se retrouve dans le noir. Et on peut allumer plusieurs lumière (glEnable(GL_LIGHT1); -> glEnable(GL_LIGHT2); etc..) tout en sachant que le nombre de lumières autorisées est limité par votre système d'exploitation, mais n'éspérez pas pouvoir en mettre plus de sept.
Dernier point, très important. Chaque vertex sont eclairé, et uniquement eux. Moins il y a de vertex et moins les tâches lumineuse seront detaillées. C'est pour cela que les sphères sont le meilleur exemple pour l'éclairage. Mais si l'on veut éclairer un mûr et que l'on veut faire apparaître une tâche bien lumineuse grâce à un spot, le mûr ne devra pas être composé de 4 vertex. Il devra étre composé d'une grille de vertex.
On peut placer la lumière que l'on crée n'importe où dans l'éspace. Il suffit de définir un tableau de 4 paramètres. Les trois premiers sont le positionnement de la lumière et le dernier définit la manière d'éclairer.
Une light suit les mêmes règles de transformations. Elle peut tourner autour d'un objet, se déplacer en translation.
Une source lumineuse est dite ponctuelle lorsqu'elle éclaire d'un point fixe, comme un lampadaire, et elle est dite directionnelle lorsqu'elle éclaire de manière continue, comme le soleil.
Donc le quatrième paramètre du tableau défini la lumière en ponctuelle s'il est mis à 1.
S'il est mis à 0, se sera une source directionnelle.
L'exemple qui suit nous montre comment définir une light au centre de la matrice, éclairant de manière ponctuelle.
float LightPos[4]={0,0,0,1} | |
glLightfv(GL_LIGHT0,GL_POSITION,LightPos); | |
glMateriali(GL_FRONT_AND_BACK,GL_SHININESS,40); | //définit la taille de la tache spéculaire |
![]() | ![]() |
Ne fonctionne que sur une source ponctuelle. Par défault la lumière ne s'atténue pas, mais il existe des variables pour modifier cela afin d'obtenir un système d'ombre qui se modifie suivant la distance d'un objet par rapport à la source lumineuse.
l'attenuation suit une petite formule : 1/(kc+kl*d+kq²)
kc = GL_CONSTANT_ATTENUATION
kl = GL_LINEAR_ATTENUATION
kq = GL_QUADRATIC_ATTENUATION
On les modifie grâce à glLightf(GL_LIGHT0,GL_CONSTANT_ATTENUATION,0.01f);
Les paramètres sont faciles à comprendre. Par défault kc=1, kl=0 et kq=0; (pas d'atténuation).
Essayez pour commencer kc=0.1, kl=0 et kq=0.02 vous attenuerez progressivement la source lumineuse
Voyons maintenant comment changer la couleur de la source lumineuse elle même.
Il suffit de créer un tableau à 4 cases. Les trois premières valeurs étant la couleur. Le quatrième paramètre n'a pour l'instant pas d'importance laissez le à 1. On utilise glLightfv(); comme ci-dessous:
float lightDiffuse[4]={1,0,0,1}; |
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiffuse); |
voilà comment transformer la couleur Diffuse de la lumière en rouge. Pour le speculair et l'ambiant vous avez compris comment faire. Ce changement de couleur ne change rien à la couleur du matériaux, qu'il faut impérativement définir. Regardez la formule en haut de la page. En fait si votre matière est blanche (1,1,1) avec la lumière rouge (1,0,0) ça donnera du rouge. Si matière est jaune (1,1,0) et lumière est bleu claire (0,1,1) ça donnera du vert (0,1,0).
Toutes les lights ponctuelles sont en fait des spots, qui ont un angle par default de 180 degrés. On peut modifier ce paramétre, et la direction du spot avec respectivement glLighti(GL_LIGHT0,GL_SPOT_CUTOFF, angle en degre); et glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION, tableau a 3 cases);
exemple:
float spotDir[3]={0,0,-1}; |
glLighti(GL_LIGHT0,GL_SPOT_CUTOFF, 30); |
glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION, spotDir); |
Dans cet exemple le spot éclaire avec un angle de 30 degrés, sa direction corresond au vecteur formé par spotDir.
Un spot un minimum réaliste doit éclairer plus fort au milieu de la tâche qu'à l'extèrieur. Il existe un facteur exponentiel que l'on peut modifier pour changer le dégradé de la tâche lumineuse du spot sur un objet. Il faut utiliser glLighti(GL_LIGHT0, GL_SPOT_EXPONENT, entre 0 et 128); il faut éviter d'y mettre 0, a 128 la tâche sera super belle mais reduite. Choisissez plutôt un chiffre entre 20 et 30, là se sera beau. Voilà ce que ça donne si vous compilez la source qui va avec ce cour:
![]() | ![]() | ![]() |
Retour |
contact: ultrafil [AT] fr.st |